Spring Security是一个能够为基于Spring的
企业应用系统提供声明式的安全
访问控制解决方案的安全框架。它提供了一组可以在Spring应用
上下文中配置的Bean,充分利用了Spring IoC,DI(
控制反转Inversion of Control ,DI:Dependency Injection
依赖注入)和
AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业
系统安全控制编写大量重复代码的工作。
简介
Spring Security 的前身是
Acegi Security ,是 Spring
项目组中用来提供安全
认证服务的框架。
Spring Security 为基于J2EE
企业应用软件提供了全面
安全服务。特别是使用领先的J2EE解决方案-Spring框架开发的企业软件项目。
(概述图片来源:,内容来源:)
功能
Spring Security对Web安全性的支持大量地依赖于Servlet过滤器。这些过滤器拦截进入请求,并且在应用程序处理该请求之前进行某些安全处理。 Spring Security提供有若干个过滤器,它们能够拦截Servlet请求,并将这些请求转给认证和访问
决策管理器处理,从而增强安全性。根据自己的需要,可以使用适当的过滤器来保护自己的应用程序。
如果使用过Servlet过滤器且令其正常工作,就必须在Web应用程序的web.xml文件中使用
和元素配置它们。虽然这样做能起作用,但是它并不适用于使用依赖注入进行的配置。FilterToBeanProxy是一个特殊的Servlet过滤器,它本身做的工作并不多,而是将自己的工作委托给Spring应用程序
上下文 中的一个Bean来完成。被委托的Bean几乎和其他的Servlet过滤器一样,实现javax.servlet.Filter接 口,但它是在Spring
配置文件而不是web.xml文件中配置的。
实际上,FilterToBeanProxy代理给的那个Bean可以是javax.servlet.Filter的任意实现。这可以是 Spring Security的任何一个过滤器,或者它可以是自己创建的一个过滤器。但是正如本书已经提到的那样,Spring Security要求至少配置四个而且可能一打或者更多的过滤器。
优点
人们使用Spring Security有很多种原因,不过通常吸引他们的是在J2EE Servlet规范或
EJB规范中找不到典型
企业应用场景的解决方案。
特别要指出的是他们不能在WAR 或 EAR 级别进行移植。
这样,如果更换服务器环境,就要,在新的目标环境进行大量的工作,对应用系统进行重新配置安全。
使用Spring Security 解决了这些问题,也提供很多有用的,完全可以指定的其他
安全特性。
可能知道,安全包括两个主要操作。
第一个被称为“认证”,是为用户建立一个他所声明的主体。主体一般是指用户,设备或可以在系统中执行动作的其他系统。
第二个叫“授权”,指的是一个用户能否在应用中执行某个操作,在到达授权判断之前,身份的主体已经由
身份验证过程建立。
这些概念是通用的,不是Spring Security特有的。
在
身份验证层面,Spring Security广泛支持各种身份验证模式,这些验证模型绝大多数都由第三方提供,或者正在开发的有关标准机构提供的,例如 Internet Engineering Task Force.
作为补充,Spring Security 也提供了自己的一套验证功能。
Spring Security 支持认证一体化如下
认证技术:
HTTP BASIC authentication headers (一个基于IEFT RFC 的标准)
HTTP Digest authentication headers (一个基于IEFT RFC 的标准)
HTTP X.509 client certificate exchange (一个基于IEFT RFC 的标准)
LDAP (一个非常常见的跨平台认证需要做法,特别是在大环境)
Form-based authentication (提供简单
用户接口的需求)
OpenID authentication
Computer Associates Siteminder
JA-SIG Central Authentication Service (
CAS,这是一个流行的开源单点登录系统)
Transparent authentication context propagation for Remote Method Invocation and HttpInvoker (一个Spring远程调用协议)
使用技巧
部署“Tutorial”样例程序
这个样例程序包含在
spring发布的zip
压缩包文件,名为:spring-security-samples-tutorial-
.war。把这个文件重命名为tutorial.war(以便于部署到tomcat时简化访问的URL链接)。把这个文件放到tomcat下的webapp目录下,然后启动tomcat服务。之后就可以用链接访问这个应用程序了。这个样例程序没有做太多的事,不过的确提供了一个很好的模板能很好的把spring安全集成到项目中。绝大多数初学者在这个过程中常遇到的问题出现在简单的配置错误或者路径错误(或者WEB-inf/lib目录下缺失jar包)。必须在一个可以运行的配置环境的基础上开始构建项目。当运行程序的时候, 确保自己熟悉spring安全的调试日志输出(日志输出默认为打开状态)。虽然框架输出详细的日志,但是很多人却使用得很失败。作为一个未授权的用户点击了一个安全的链接,当登录,退出等等情况下的时候到底发生了什么?当进入到安全过滤器链开始处理的时候,将会看到每一个http请求及如何处理的日志,所以许多在论坛中报道的问题可以按网页
浏览器请求的相应日志记录来匹配查找得以解决
在
命名空间第一章节的第一部分,绝大部分是关于之前学习过的两个步骤,进入前面使用过指南样例(tutorial
sample)命令
空间元素并且理解它们的主要目的。如果有修改过Petclinic tutorial或者其它的样例程序,参考向导(Reference Guide)的其它部分将带进入更详细的有关于框架实现类,如果有需要的话,可以浏览下它们。
这个样例将尝试更多spring安全框架高级属性,尤其是
ACL模块。文件spring-security-samples-contacts-
.war是标准的web MVC应用程序,它可以让以特殊的用户(列举在登录页面的用户)登录并且查看数据库中的”通讯录”,每个登录用户都有若干权限列表,如何登录用户有必需的权限的就可以查看若干的通讯录列表。有某个通讯录管理权限的用户就可以删除这个通讯录,创建或者删除其中实例的权限,因此可以分配(重分配)其它用户读,写,管理通讯录中实例的权限。Spring安全应用在方法级通过在接口ContactManager使用注释(annotations)配置来引入的。到这个步骤应该对spring的安全如果发觉功效有了很好的领会,剩下的工作应该是如果设计应用程序来实现安全了。推荐使用指南样例(Tutorial Sample)来完成实际的集成工作,即使有复杂的需求。大多数在论坛中报告问题的都是出自配置的问题,因为他们在一开始在并不知道将要如果进行的时候做了太多的改变。
版本发布
2010年12月22日,Spring Security 3.1.0.M2 发布。
2011年02月12日,Spring Security 3.1.0.RC1 发布,与 M2 版本比较,该版本主要改进内容请看 changelog 。
2011年05月01日,Spring Security 3.1.0.RC2 发布。
2011年12月08日,Spring Security 3.1.0 GA版 发布,改进:
新特性:添加支持bcrypt
密码编码,允许使用一个显式定义一个过滤器链RequestMatcher当使用
名称空间,允许使用定制AuthenticationManager在< http >和全球方法安全性。
在文档中添加“改进点”章节
AbstractAuthenticationProcessingFilter 接口应当包含AuthenticationFailureHandler 和 AuthenticationSuccessHandler的
getter方法
在命名空间文档中删除自动配置
方便在多个服务中创建DefaultSpringSecurityContextSource
认证的管理不能被重写
DelegatingMethodSecurityMetadataSource中包含有过多的(误导性)的日志
提醒用户use-secure-cookie设置为false并不能真正的阻止cookie被标记为安全
在命名空间的解析代码中移除了过时的方法
模型中的ID类型不利于使用Spring 3.1的概要文件。
改进命名空间的文档。
2014年8月19日,Spring Security 4.0.0.M2 发布。
主要改进内容:
Support nested static groups in LDAP Authentication
Lots of integration tests added to the sample applications
Updated minimum version of Spring 4.1 RC2. This was necessary for enough of the features, that it made sense to do across the board
更多内容请看发行日志。